package 图表库;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;

import org.jfree.data.xy.XYSeriesCollection;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.util.Vector;

public class Jpolt implements Runnable {
    public static final int REPAINT_INTERVAL = 30; // 设置画面刷新时间 每秒30帧
    JFreeChart chart;// Jpolt 创建图表
    public XYLineAndShapeRenderer renderer;
    NumberAxis domainAxis; // 设置图表 x 轴的范围
    NumberAxis rangeAxis ; // 设置图表 y 轴的范围
    public static JFrame frame;  // 设置图形界面
    public static ChartPanel panel; // 设置 jfreechart 画笔
    public Vector<JpoltCurve> curves = new Vector<>(); // 需要绘制的曲线列表
    public static XYPlot plot; // 获取XYPlot
    private static XYSeriesCollection dataset; // 数据集
    public static double S_speed; // 显示 Frenet s轴的实时速度
    public Jpolt(){
        initFont();     // 设置主题字体
        init();         //
        initFrame();    // 创建图形界面
        new Thread(this).start(); // 启动线程
    }
    // 创建线程刷新画面
    @Override
    public void run() {
        while(true){
            panel.revalidate();// 更新 jfreechart 画笔
            panel.repaint();
            try {
                Thread.sleep(REPAINT_INTERVAL);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    // 添加曲线
    public void addCurve(JpoltCurve curve){
        dataset.addSeries(curve.curver);   // 将曲线数据添加到 dataset 中
        this.curves.add(curve);  // 将曲线添加到 curves 曲线集中
        renderer.setSeriesPaint(curves.size()-1,curve.color);   // 设置曲线颜色
        curve.curver.setNotify(curve.Visiblename);  // 是否显示曲线名称
        if (curve.VisiblePoint) {    //设置曲线点的形状
            switch (curve.Shape){
                case JpoltCurve.circle:
                    renderer.setSeriesShape(curves.size()-1, new Ellipse2D.Double(-3, -3, 6, 6)); //  圆点
                    break;
                case JpoltCurve.rect:
                    renderer.setSeriesShape(curves.size()-1, new Rectangle(-3, -3, 6, 6)); //  矩形
                    break;
            }
        }
        renderer.setSeriesShapesVisible(curves.size()-1, curve.VisiblePoint);  // 是否显示点
        renderer.setSeriesLinesVisible(curves.size()-1, curve.VisibleLine);    // 将点用 线段 连起来
    }
    public void remove(JpoltCurve curve){// 删除曲线
        dataset.removeSeries(curve.curver);
    }
    public void initFont(){                                                          // 设置中文字体
        StandardChartTheme chartTheme = new StandardChartTheme("CN");         //  使用中文支持的主题
        chartTheme.setExtraLargeFont(new Font("宋体", Font.BOLD, 20));   //   设置图表标题的主题, Font.BOLD: 加粗字体
        chartTheme.setRegularFont(new Font("宋体", Font.BOLD, 15));     //    设置常规字体的主题,
        chartTheme.setLargeFont(new Font("宋体", Font.BOLD, 15));      //     设置 X轴、Y轴单位 的字体样式
        ChartFactory.setChartTheme(chartTheme);                                  //     将字体应用于图表
    }
    // 设置 图形界面
    public void initFrame() {
        frame = new JFrame();
        panel = new ChartPanel(chart);
        panel.setPreferredSize(new java.awt.Dimension(800, 600));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    public void init(){
        // 创建数据集
        dataset = new XYSeriesCollection();
        // 创建图表
        chart = ChartFactory.createXYLineChart(
                " Frenet 路径规划\n 实时速度: "+S_speed+"km/h",      // 图表标题
                "X m",                                            // X 轴标签
                "Y m",                                            // Y 轴标签
                dataset,                                          // 数据集
                PlotOrientation.VERTICAL,                         // 图表方向
                false,                                             // 是否生成提示
                true,                                             // 是否生成提示
                false                                             // 是否生成 URL
        );
        plot = chart.getXYPlot();  // 从创建的图表 chart 中获取 XYPlot
        renderer = new XYLineAndShapeRenderer();
        plot.setDomainPannable(true);
        plot.setRangePannable(true);
        plot.setDomainGridlinesVisible(true);
        plot.setRangeGridlinesVisible(true);
        plot.setRenderer(renderer); // 将获取的 XYPlot 包装到 renderer 中
        domainAxis = (NumberAxis) plot.getDomainAxis(); // 获取 X轴对象
        rangeAxis = (NumberAxis) plot.getRangeAxis();  // 获取 Y轴对象
    }
    public void setRange(double X_min,double X_max,double Xunit,double Y_min,double Y_max,double Yunit){
        domainAxis.setRange(X_min, X_max);
        domainAxis.setTickUnit(new NumberTickUnit(Xunit));
        rangeAxis.setRange(Y_min,Y_max);
        rangeAxis.setTickUnit(new NumberTickUnit(Yunit));
    }
}

